﻿using TopGroup.MySharePoint.Data;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using TopGroup.MySharePoint.Common;
using Windows.Data.Xml.Dom;
using Windows.UI.Notifications;
using TopGroup.MySharePoint.DataModel;
using Sharepoint.Entities;
using Windows.Storage;
using Windows.UI.ApplicationSettings;
using System.ServiceModel;

// La plantilla de elemento Página de elementos agrupados está documentada en http://go.microsoft.com/fwlink/?LinkId=234231

namespace TopGroup.MySharePoint
{
    /// <summary>
    /// Página en la que muestra una colección de elementos agrupados.
    /// </summary>
    public sealed partial class GroupedItemsPage : TopGroup.MySharePoint.Common.LayoutAwarePage
    {
        public static GroupedItemsPage Current;
        public GroupedItemsPage()
        {
            this.InitializeComponent();
            // This is a static public property that will allow downstream pages to get 
            // a handle to the MainPage instance in order to call methods that are in this class.
            Current = this;
            try
            {
                Actualizartile();
            }
            catch (Exception ex)
            {

            }
        }

        public async void Actualizartile()
        {
            TGSharePoint sharepoint = new TGSharePoint();
            TGParametters parameters = new TGParametters();
            var tileUpdateManager = TileUpdateManager.CreateTileUpdaterForApplication();
            tileUpdateManager.EnableNotificationQueue(true);
            List<TGNews> items = null;
            try
            {
                parameters.Login = ApplicationData.Current.RoamingSettings.Values["login"].ToString();
                parameters.Password = ApplicationData.Current.RoamingSettings.Values["password"].ToString();
                parameters.Dominio = ApplicationData.Current.RoamingSettings.Values["dominio"].ToString();
                parameters.Url = ApplicationData.Current.RoamingSettings.Values["url"].ToString();
                parameters.ListName = ApplicationData.Current.RoamingSettings.Values["listName"].ToString();
                items = await sharepoint.GetNewsTile(parameters);
                foreach (TGNews temp in items)
                {
                    if (!string.IsNullOrEmpty(temp.Thumbnail))
                    {
                        tileUpdateManager.Update(new TileNotification(
                          CrearIconoCuadradoYLargo(temp.Title, "ms-appdata:///local/" + temp.Title + ".png"))
                        {
                            ExpirationTime = DateTime.UtcNow.AddMinutes(5)
                        });
                    }
                    else
                    {
                        tileUpdateManager.Update(new TileNotification(
                          CrearIconoCuadradoYLargo(temp.Title, "ms-appx:///Assets/imagen tile.png"))
                        {
                            ExpirationTime = DateTime.UtcNow.AddMinutes(5)
                        });
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }

        private XmlDocument CrearIconoCuadradoYLargo(string texto, string rutaimagen)
        {
            try
            {
                //obtenemos el xml del del icono largo
                var larga = CrearIconoLargoTextoImagen(texto, rutaimagen);
                //obtenemos el xml del icono cuadrado y extraemos su etiqueta binding 
                var cuadrada = larga.ImportNode(CrearIconoCuadradoTexto(texto).GetElementsByTagName("binding")[0], true);
                // insertamos en el xml del icono largo el binding del icono cuadrado y hacemos que sean hermanos ambos tienen a visual como padre
                larga.GetElementsByTagName("visual")[0].AppendChild(cuadrada);
                return larga;

            }
            catch (Exception ex)
            {

            }
            return null;
        }

        private XmlDocument CrearIconoCuadradoTexto(string texto)
        {
            try
            {
                var tilexml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareText04);
                tilexml.GetElementsByTagName("text")[0].AppendChild(tilexml.CreateTextNode(texto));
                return tilexml;
            }
            catch (Exception ex)
            {

            }
            return null;
        }


        private XmlDocument CrearIconoLargoTextoImagen(string texto, string rutaimagen)
        {
            try
            {
                var tilexml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideImageAndText01);
                //añadimos nuestro texto
                tilexml.GetElementsByTagName("text")[0].InnerText = texto;
                //obtenemos la etiqueta image
                dynamic imagen = tilexml.GetElementsByTagName("image");
                //añadimos la ruta de la imagen dentro del atributo "src"
                imagen[0].SetAttribute("src", rutaimagen);
                return tilexml;
            }
            catch (Exception ex)
            {
            }
            return null;
        }
        /// <summary>
        /// Rellena la página con el contenido pasado durante la navegación. Cualquier estado guardado se
        /// proporciona también al crear de nuevo una página a partir de una sesión anterior.
        /// </summary>
        /// <param name="navigationParameter">Valor de parámetro pasado a
        /// <see cref="Frame.Navigate(Type, Object)"/> cuando se solicitó inicialmente esta página.
        /// </param>
        /// <param name="pageState">Diccionario del estado mantenido por esta página durante una sesión
        /// anterior. Será null la primera vez que se visite una página.</param>
        protected async override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
        {
            try
            {
                if (SampleDataSource.AllGroups.Count == 0)
                    await SampleDataSource.GetUserInfoAsync();
                var sampleDataGroups = SampleDataSource.GetGroups((String)navigationParameter);
                this.DefaultViewModel["Groups"] = sampleDataGroups;
                this.groupGridView.ItemsSource = this.groupedItemsViewSource.View.CollectionGroups;
            }
            catch (Exception ex)
            {
                var dlg = new Windows.UI.Popups.MessageDialog("\nPlease go to settings and check the credentials of the site");
                var temp = dlg.ShowAsync();
            }
            this.ProgressRing.IsActive = false;

        }

        public async void LoadFromSettings()
        {
            this.ProgressRing.IsActive = true;
            try
            {
                if (SampleDataSource.AllGroups.Count == 0)
                    await SampleDataSource.GetUserInfoAsync();
                var sampleDataGroups = SampleDataSource.GetGroups("AllGroups");
                this.DefaultViewModel["Groups"] = sampleDataGroups;
                this.groupGridView.ItemsSource = this.groupedItemsViewSource.View.CollectionGroups;
            }
            catch (Exception ex)
            {
                var dlg = new Windows.UI.Popups.MessageDialog("\nPlease go to settings and check the credentials of the site");
                var temp = dlg.ShowAsync();
            }
            this.ProgressRing.IsActive = false;
        }

        /// <summary>
        /// Se invoca al hacer clic en un encabezado de grupo.
        /// </summary>
        /// <param name="sender">Objeto Button usado como encabezado del grupo seleccionado.</param>
        /// <param name="e">Datos de evento que describen cómo se inició el clic.</param>
        void Header_Click(object sender, RoutedEventArgs e)
        {
            // Determinar el grupo al que representa la instancia de Button
            var group = (sender as FrameworkElement).DataContext;

            // Navegar a la página de destino adecuada y configurar la nueva página
            // al pasar la información requerida como parámetro de navegación
            this.Frame.Navigate(typeof(GroupDetailPage), ((SampleDataGroup)group).UniqueId);
        }

        /// <summary>
        /// Se invoca al hacer clic en un elemento contenido en un grupo.
        /// </summary>
        /// <param name="sender">Objeto GridView (o ListView cuando la aplicación está en estado Snapped)
        /// que muestra el elemento en el que se hizo clic.</param>
        /// <param name="e">Datos de evento que describen el elemento en el que se hizo clic.</param>
        void ItemView_ItemClick(object sender, ItemClickEventArgs e)
        {
            try
            {
                // Navegar a la página de destino adecuada y configurar la nueva página
                // al pasar la información requerida como parámetro de navegación
                var itemId = ((SampleDataItem)e.ClickedItem).UniqueId;
                this.Frame.Navigate(typeof(ItemDetailPage), itemId);
            }
            catch (Exception ex)
            {
            }
        }

        public async void recargar()
        {
            this.ProgressRing.IsActive = true;
            try
            {
                SampleDataSource.Reload();
                Actualizartile();
                await SampleDataSource.GetUserInfoAsync();
                var sampleDataGroups = SampleDataSource.GetGroups("AllGroups");
                this.DefaultViewModel["Groups"] = sampleDataGroups;
                this.groupGridView.ItemsSource = this.groupedItemsViewSource.View.CollectionGroups;
            }
            catch (Exception ex)
            {

            }
            this.ProgressRing.IsActive = false;
        }
    }
}
